/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package GlobalObservingSystem.Mundo.GeneracionDatos;

import GlobalObservingSystem.Interfaces.IGeneradorDatos;
import java.nio.ByteBuffer;
import java.util.Random;

/**
 *
 * @author luis cabarique
 */
public class GeneradorDatos implements IGeneradorDatos {

    //-----------------------------------------
    //Constantes
    //-----------------------------------------

    private static final int ESTACIONES_SUELO = 11000;
    private static final int ESTACIONES_BOYA = 900;
    private static final int ESTACIONES_AVION = 300;
    private static final int ESTACIONES_SATELITE = 5;
    private static final int ESTACIONES_GLOBO = 450;
    private static final byte ARROBA = (byte) '@';
    private static final byte NUMERAL = (byte) '#';
    private static final byte AMPERSAN = (byte) '&';
    private static final byte BOYA = (byte) 1;
    private static final byte AVION = (byte) 2;
    private static final byte SATELITE = (byte) 3;
    private static final byte GLOBO = (byte) 4;
    private static final byte ESTACION = (byte) 5;
    private static final byte[] ESTACIONES = {BOYA, AVION, SATELITE, GLOBO, ESTACION};
    private static final int NUMERO_ESTACIONES = 5;
    private static final byte PRESION = (byte) 1;
    private static final byte VELOCIDAD = (byte) 2;
    private static final byte DIRECCION = (byte) 3;
    private static final byte TEMPERATURA_AIRE = (byte) 4;
    private static final byte HUMEDAD = (byte) 5;
    private static final byte TEMPERATURA_AGUA = (byte) 6;
    private static final byte LLUVIA = (byte) 7;
    private static final byte[] MEDICIONES = {PRESION, VELOCIDAD, DIRECCION, TEMPERATURA_AIRE, HUMEDAD, TEMPERATURA_AGUA, LLUVIA};
    private static final int NUMERO_MEDICIONES = 7;
    private static final int HEADER = 4;
    private static final int CAMPO2 = 1;
    private static final int CAMPO3 = 4;
    private static final int CAMPO4 = 4;
    private static final int CAMPO5 = 4;
    private static final int CAMPO6 = 4;
    private static final int CAMPO7 = 1;
    private static final int DATOS1 = 1;
    private static final int DATOS2 = 4;
    private static final int DATOS3 = 8;
    private static final int RELLENO = 50;
    private static final int FOOTER = 4;

    //-----------------------------------------
    //Atributos
    //-----------------------------------------
    private int idDispositivo;

    //-----------------------------------------
    // Constructor
    //-----------------------------------------
    public GeneradorDatos() {
        generarTrama();

    }

    /**
     * Genera una serie de tramas que luego envía al sistema para ser convertidas en mediciones
     */
    public void generarTrama() {
        Random rnd = new Random();
        int numeroMedicion = rnd.nextInt(10);
        int numeroInstrumento = rnd.nextInt(NUMERO_ESTACIONES);

        byte[] trama = new byte[HEADER + CAMPO2 + CAMPO3 + CAMPO4 + CAMPO5 + CAMPO6 + CAMPO7 + ((DATOS1 + DATOS2 + DATOS3) * numeroMedicion) + RELLENO + FOOTER];
        int prub = 0;
        while (prub !=trama.length)
        {
            trama[prub] = 1;
            prub++;
        }
        //header
        trama[0] = ARROBA;
        trama[1] = ARROBA;
        trama[2] = ARROBA;
        trama[3] = ARROBA;
        //la estacion
        trama[4] = ESTACIONES[numeroInstrumento];
        //ID de la estacion
        byte[] nId = new byte[3];
        int a = rnd.nextInt(2047);
        nId = int2bytearray(a);
        trama[5] = ESTACIONES[numeroInstrumento];
        trama[6] = nId[0];
        trama[7] = nId[1];
        trama[8] = nId[2];


        //Latitud-Arreglar
        //Grados
        byte[] gra = new byte[2];
        int a1 = rnd.nextInt(360)-180;
        gra = int2bytearray(a1);
        trama[9] = gra[0];
        trama[10] = gra[1];
        //minutos
        String b = rnd.nextInt(60) + "";
        trama[11] = Byte.parseByte(b);
        //segundos
        String x = rnd.nextInt(60) + "";
        trama[12] = Byte.parseByte(x);

        //Longitud-Arreglar
        //Grados
        byte[] gra1 = new byte[2];
        int a2 = rnd.nextInt(360)-180;
        gra1 = int2bytearray(a2);
        trama[13] = gra1[0];
        trama[14] = gra1[1];
        //minutos
        String b1 = rnd.nextInt(60) + "";
        trama[15] = Byte.parseByte(b1);
        //segundos
        String x1 = rnd.nextInt(60) + "";
        trama[16] = Byte.parseByte(x1);

        //Altitud
        byte[] altura =  new byte[4];
        int al1 = rnd.nextInt(40000000);
        int al2 = (rnd.nextInt(11055))*-1;
        altura = int2bytearray(al1+al2);
        trama[17] = altura[0];
        trama[18] = altura[1];
        trama[19] = altura[2];
        trama[20] = altura[3];

        //Numero MediCiones
        trama[21] = Byte.parseByte(numeroMedicion + "");

        //CiClo de mediCiones
        byte tipo;
        int dat = 22;
        for (int i = 0; i <= numeroMedicion; i++) {

            //tipo de medicion


           tipo = MEDICIONES[rnd.nextInt(NUMERO_MEDICIONES)];
           switch (tipo)
           {
               case 1:
                   //presion atmosferica
                   byte[] pres = new byte[4];
                   int p = 33775 + rnd.nextInt(100000);
                   pres = int2bytearray(p);
                   System.out.println("presi:" + pres[0]+"-" + pres[1]+"-" + pres[2]+"-"+ pres [3]+"-");
                   System.out.println("numero" + bytearray2int(pres) + "-"+ p);

                   trama[dat] = pres[0];
                              System.out.println("1" +trama[dat]);
                   trama[dat+1] = pres[1];
                              System.out.println("2"+trama[dat+1]);
                   trama[dat+2] = pres[2];
                              System.out.println("3"+trama[dat+2]);
                   trama[dat+3] = pres[3];
                              System.out.println("4"+trama[dat+3]);
                   break;
               case 2:
                   //velocidad viento
                   byte[] vv = new byte[4];
                   int v = rnd.nextInt(372000);
                   vv = int2bytearray(v);
                   trama[dat] = vv[0];
                   trama[dat+1] = vv[1];
                   trama[dat+2] = vv[2];
                   trama[dat+3] = vv[3];
                   break;
               case 3:
                   //direccion viento
                   byte[] dv = new byte[4];
                   int d = rnd.nextInt(360)-180;
                   dv = int2bytearray(d);
                  trama[dat] = dv[0];
                   trama[dat+1] = dv[1];
                   trama[dat+2] = dv[2];
                   trama[dat+3] = dv[3];

                   break;
               case 4:
                   //temperatura aire
                   byte[] ta = new byte[4];
                   int t= 183 + rnd.nextInt(148);
                   ta = int2bytearray(t);
                                     trama[dat] = ta[0];
                   trama[dat+1] = ta[1];
                   trama[dat+2] = ta[2];
                   trama[dat+3] = ta[3];
                   break;
               case 5:
                   //humedad relativa
                   byte[] hr = new byte[4];
                   int h = rnd.nextInt(100);
                   hr = int2bytearray(h);
                                     trama[dat] = hr[0];
                   trama[dat+1] = hr[1];
                   trama[dat+2] = hr[2];
                   trama[dat+3] = hr[3];
                   break;
               case 6:
                   //temperatura agua:
                   byte[] tag = new byte[4];
                   int tg = -1 + rnd.nextInt(101);
                   tag = int2bytearray(tg);
                                     trama[dat] = tag[0];
                   trama[dat+1] = tag[1];
                   trama[dat+2] = tag[2];
                   trama[dat+3] = tag[3];
                   break;
               case 7:
                   //Precipitacion
                   byte[] presi = new byte[4];
                   int pr = rnd.nextInt(13300);
                   presi = int2bytearray(pr);
                                     trama[dat] = presi[0];
                   trama[dat+1] = presi[1];
                   trama[dat+2] = presi[2];
                   trama[dat+3] = presi[3];
                   break;
           }
                                         System.out.println("1" +trama[dat]);

                              System.out.println("2"+trama[dat+1]);

                              System.out.println("3"+trama[dat+2]);

                              System.out.println("4"+trama[dat+3]);
                       dat+= 4;
           //TODO

        }

        //Campo vaCio
        for (int i = 1; i <= RELLENO+1; i++) {
            trama[HEADER + CAMPO2 + CAMPO3 + CAMPO4 + CAMPO5 + CAMPO6 + CAMPO7 + ((DATOS1 + DATOS2 + DATOS3) * numeroMedicion)+i] = 0;
        }

        //CRC
        trama[trama.length-5] =  (byte) trama.length;

        //footer
        trama[trama.length - 1] = NUMERAL;
        trama[trama.length - 2] = NUMERAL;
        trama[trama.length - 3] = NUMERAL;
        trama[trama.length - 4] = NUMERAL;

        String s4 = new String(trama);

        System.out.println(trama[33]);


    }


    private static byte[] int2bytearray(int i) {
        byte b[] = new byte[4];

        ByteBuffer buf = ByteBuffer.wrap(b);
        buf.putInt(i);
        return b;
    }

    private static int bytearray2int(byte[] b) {
        ByteBuffer buf = ByteBuffer.wrap(b);
        return buf.getInt();
    }

    public static void main(String[] args) {
        GeneradorDatos g = new GeneradorDatos();
    }
}
